AWS CodeBuildでの日本語ログ出力されないことについて調査してみた
どうも!大阪オフィスの西村祐二です。
AWS CodeBuildを使って検証しているときに日本語(マルチバイト文字列)部分がログに出力されていないことが判明したので、調査してみました。 ※2017/10/16時点の調査になりますのでご了承ください。
利用ビルド環境
・コンテナイメージ:aws/codebuild/python:3.5.2
AWS CodeBuild によって管理されたイメージの使用し、マネージメントコンソールから指定できるものを選択しました。
再現してみる
日本語が表示されない現象を簡単に再現してみます。
CodeBuildで指定するリポジトリ内に日本語名のファイルを置いておき、ビルド時にlsでリスト表示してみます。
ローカルにあるリポジトリ内の状況
$ ls -l total 32 -rw-r--r-- 1 nishimura.yuji staff 130 10 17 14:09 README.md -rw-r--r-- 1 nishimura.yuji staff 1398 11 16 17:37 buildspec.yml -rw-r--r-- 1 nishimura.yuji staff 726 11 8 12:38 test.py -rw-r--r-- 1 nishimura.yuji staff 385 11 7 14:27 timer.py -rw-r--r-- 1 nishimura.yuji staff 0 11 7 16:06 てすと.txt
buildspec.ymlはただlsするだけです。
version: 0.2 phases: build: commands: - ls -l
ビルドしてみる
マネージメントコンソール上にビルドログが表示されますが、 「てすと.txt」ではなく、「.txt」となっていることがわかります。 実行は問題なく完了されます。
ビルドログはCloudWatchLogsとリンクしているため、同様の表示になっています。
プログラムの挙動はどうなるのか
次に気になることとしては、CodeBuild内で実行するプログラムの中で日本語を扱っていた場合どうなるか確認してみました。
S3に日本語を含むファイル出力とログを出力するプログラムを実行してみる
下記test.pyファイルをリポジトリ内にいれておき、buildspec.ymlにビルド時に起動するように編集します。 下記プログラムは、S3に1秒ごとに、日本語を含む「1番目.txt」から「5番目.txt」までファイルを出力します。 また、「○秒経過しました。」とログに出力するようにしています。
# -*- coding: utf-8 -*- import boto3 from time import sleep import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # S3 BUCKET_NAME = "test-bucket-batch" TARGET_DIR = "batch" FILE_CONTENTS = "" # Timer MAX_ITER = 5 SEC = 1 def PutS3(i): s3 = boto3.resource('s3') bucket = s3.Bucket(BUCKET_NAME) filename = str(i+1) + "番目" obj = bucket.put_object(ACL='private', Body=FILE_CONTENTS, Key=TARGET_DIR + "/" + filename, ContentType='text/plain') return str(obj) def count(count): print("{}秒経過しました。".format((count+1)*SEC)) for i in range(MAX_ITER): sleep(SEC) count(i) PutS3(i)
buildspec.ymlを下記のように編集します。
version: 0.2 phases: install: commands: - pip install --upgrade pip - pip install --upgrade awscli - pip install --upgrade boto3 build: commands: - python ./test.py
実行結果
S3へのファイル出力は問題なく、想定どおり「○番目」というように出力されていました。
ビルドログへは日本語は出力されておらず、数字のみが出力されていました。
調査してみる
コンテナ内を確認して行きましょう
コンテナ内の言語環境を確認してみる
buildspec.ymlを下記のように編集して実行してみます。
version: 0.2 phases: build: commands: - echo $LANG - locale -a - locale - grep ja /usr/share/i18n/SUPPORTED
実行結果
▼現在のlocaleの確認
日本語のlocaleがないことがわかります
▼日本語のLocaleをサポートしているか確認
日本語のlocaleがサポートされていることがわかります
日本語環境をいれて言語環境を日本語にしてみる
buildspec.ymlを下記のように編集します。
ビルドのはじめと最後にdate
コマンドを入れているのはきちんと日本語環境になったか確認するためです。
想定どおり、日本語環境になっていれば下記のように表示フォーマットが変化しているはずです。
想定 変更前:Fri Nov 17 05:38:26 UTC 2017 ↓ 変更後:2017年 11月 17日 金曜日 05:38:26 UTC
version: 0.2 phases: install: commands: - apt-get update -y - apt-get -y install language-pack-ja-base language-pack-ja build: commands: - date - echo $LANG - locale -a - locale-gen ja_JP.UTF-8 - /usr/sbin/update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja" - locale -a - export LANG=ja_JP.UTF-8 - export LANGUAGE=”ja_JP:ja” - echo $LANG - locale - ls -l - date
実行結果
▼localeを確認 インストールフェーズで日本語パックをインストールしたので、 「ja_JP.utf8」が追加されていることがわかります。
▼update-localeを実行しておきます
▼環境変数を変更し、正常に変更されていることを確認
▼dateコマンド、lsコマンドの結果を確認
lsコマンドの結果より、日本語(マルチバイト文字列)は表示されておらず、 dateコマンドの結果からフォーマットは変化していますが、 こちらも日本語(マルチバイト文字列)は表示されていないことがわかります。
違うコンテナイメージを利用して検証してみる
下記ブログを参考にGUI上では表示されていませんが、 日本語環境をもとから含む、Amazon Linuxのイメージに変更して検証してみたいと思います。
▼利用ビルド環境 カスタムイメージID: aws/codebuild/eb-python-3.4-amazonlinux-64:2.1.6
buildspce.ymlをAmazon Linux用に少し編集します。 Amazon Linux にはもともと、日本語環境が入っているので日本語パックなどの設定は不要です。
version: 0.2 phases: build: commands: - date - echo $LANG - locale -a | grep ja - locale - export LANG=ja_JP.UTF-8 - export LANGUAGE=”ja_JP:ja” - echo $LANG - locale - ls -l - date
実行結果
▼dateコマンドの出力結果(言語設定変更前)
▼LANGの確認
▼localeを確認
もとから日本語環境が入っているので、 「ja*」が複数あることがわかります。
▼locale設定を確認
▼環境変数を変更し、正常に変更されていることを確認
▼dateコマンド、lsコマンドの結果を確認 lsコマンドの結果より、日本語(マルチバイト文字列)は表示されておらず、 dateコマンドの結果からフォーマットは変化していますが、 こちらも日本語(マルチバイト文字列)は表示されていないことがわかります。
結論
コンテナ側の問題ではなさそうです。
さいごに
いかがだったでしょうか
AWS CodeBuildで日本語が出力されない原因を調べるために、 ビルド環境で利用するコンテナを調査してみました。
英語ドキュメントのみの記載でいままで気が付きませんでしたが、 ドキュメントにも英語以外の文字列があると失敗する旨の記載がありました。 なぜかビルドに失敗するなどあれば、英語以外の文字列を含まれていることが関係しているかもしれません。
http://docs.aws.amazon.com/codebuild/latest/userguide/troubleshooting.html#troubleshooting-utf-8